package org.xxpay.pay.channel.yeepay.util;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.xxpay.core.common.util.MyLog;
import java.util.*;

public class XmlUtils {

    private static final MyLog logger = MyLog.getLog(XmlUtils.class);

    /**
     * 将map转换为xml格式， 不支持CDATA
     * @param params
     * @return
     */
    public static String toXml(Map<String, String> params){
        StringBuilder buf = new StringBuilder();
        List<String> keys = new ArrayList<>(params.keySet());
        Collections.sort(keys);
        buf.append("<xml>");
        for(String key : keys){
            buf.append("<").append(key).append(">").append(params.get(key));
            buf.append("</").append(key).append(">\n");
        }
        buf.append("</xml>");
        return buf.toString();
    }

    /**
     * 将xml转换为map格式， 不支持嵌套数据
     * @param xml
     * @return
     */
    public static Map<String,String> xml2Map(String xml) {
        return xml2Map(xml ,null);
    }

    /**
     * 将xml转换为map格式, 不支持嵌套数据
     * @param xml 原始报文
     * @param elements 需要获取到的节点， null表示从根节点获取，   格式 xxx.xxx.xxx
     * @return
     */
    public static Map<String, String> xml2Map(String xml, String elements){

        Map<String, String> result = new HashMap<>();
        try {
            Document doc = DocumentHelper.parseText(xml);//将xml转为dom对象

            Element ele = doc.getRootElement();//获取根节点 也可以element.elements("userList")指定获取子元素

            if(elements != null){
                for(String a : elements.split("\\.")){
                    ele = ele.element(a);
                    if(ele == null) { ///当节点不存在
                        return result;
                    }
                }
            }

            List<Element> elementList = ele.elements();
            for (Element item : elementList) {  //遍历子元素
                if (item.elements().size() > 0) { //嵌套格式数据
                    continue;
                }
                result.put(item.getName(), item.getTextTrim());
            }
        } catch (Exception e) {
            logger.error("xmlUtils", e);
        }

        return result;

    }
}

